//
//  MCStatus.swift
//  HXWeibo
//
//  Created by HX on 15/11/30.
//  Copyright © 2015年 HX. All rights reserved.
//

import UIKit

import SDWebImage

class MCStatus: NSObject
{
    ///微博创建时间
    var created_at: String?

    ///微博ID
    var id: Int = 0
    
    ///微博信息内容
    var text: String?
    
    ///微博来源
    var source: String?
    
    ///图片
    var pic_urls: [[String: AnyObject]]?
        {
            didSet
            {
                if pic_urls?.count == 0
                {
                    return
                }
                
                storePictureURLs = [NSURL]()
                // 有图片，获取到对应的图片地址，生成NSURL,赋值给pictureURLs
                for dict in pic_urls!
                {
                    //获取字典里面的图片urlString
                    let urlStr = dict["thumbnail_pic"] as! String
                    
                    // 创建 NSURL
                    let url = NSURL(string: urlStr)!
                    
                    // 添加到 pictureURLs
                    storePictureURLs?.append(url)
                }
            }
        }
    
    /// 缩略图NSURL数组,原创微博的图片数组
    var storePictureURLs: [NSURL]?
    
    // 当模型是原创微博的时候,返回原创微博对应的图片URL,如果是转发微博，返回被转发微博的图片URL
    var pictureURLs: [NSURL]?
        {
            return retweeted_status == nil ? storePictureURLs : retweeted_status?.storePictureURLs
        }
    
    /// 用户模型
    var user: MCUser?
    
    ///转发数
    var reposts_count: Int = 0
    
    ///评论数
    var comments_count: Int = 0
    
    ///表态数
    var attitudes_count: Int = 0
    
    ///行高
    var rowHeight: CGFloat?
    
    ///被转发的微博
    var retweeted_status: MCStatus?
    
    ///模型根据自己是否有 retweeted_status 属性 表示是转发微博，没有这个属性 就是原创微博
    func cellId() -> String
    {
//        return retweeted_status == nil ? MCStatusNormalCell : MCStatusForwardCell ❌
        
        return retweeted_status == nil ? MCStatusReuseIdentifier.NormalCell.rawValue : MCStatusReuseIdentifier.ForwardCell.rawValue
    }
    
    /// 字典转模型
    init(dict: [String: AnyObject])
    {
        super.init()
        
        //KVC字典转模型
        setValuesForKeysWithDictionary(dict)
    }
    
    override func setValue(value: AnyObject?, forKey key: String)
    {
//        print("key-->\(key)")
        
        if key == "user"
        {
            // 如果user的value是字典
            if let dict = value as? [String: AnyObject]
            { //字典转模型
                user = MCUser(dict: dict)
            }
            /// 一定要记得return ,不让会被父类重新赋值，覆盖掉了
            return
        }
        
        // 设置被转发微博
        if key == "retweeted_status"
        {
            if let dict = value as? [String: AnyObject]
            {
                // 手动字典转模型,赋值给 retweeted_status 属性
               retweeted_status = MCStatus(dict: dict)
            }
            // MARK: - 一定要记得return ,不让会被父类重新赋值，覆盖掉了
            return
        }
        
        // 调用父类的方法
        super.setValue(value, forKey: key)
    }
    
    /// 当KVC字典转模型时 字典的key在模型中找不到对应的属性，会来调用，空实现这个方法就可以了
    override func setValue(value: AnyObject?, forUndefinedKey key: String){}
    
    ///对象信息
    override var description: String
    {
        // 数组存放的是需要打印的属性
        let properties = ["created_at", "id", "text", "pic_urls", "source", "reposts_count", "comments_count", "attitudes_count", "user", "retweeted_status"]
        
        // 根据传入数组作为字典的key,value会从模型里面自动获取
        return "\n \t 模型: \(dictionaryWithValuesForKeys(properties))"
    }
    
    /// 获取微博数据
    class func loadStatus(since_id: Int, max_id: Int, finished: (statuses: [MCStatus]?, error: NSError?) -> ())
    {
        /// 调用网络工具类获取数据
        MCNetworkTool.sharedInstance.loadStatus(since_id, max_id: max_id) { (result, error) -> () in
            
//            print("获取微博数据--->\(result)")
            
            // 判断是否有错误
            if error != nil || result == nil
            {
                print("获取微博出错数据--->\(error)")
                
                finished(statuses: nil, error: error)
                
                return
            }
            // 加载到微博数据,字典转模型
            if let array = result!["statuses"] as? [[String: AnyObject]]
            {
                // 能到这里来， statuses数据没有问题
                
                var statuses = [MCStatus]()
                
                // 遍历数组，获取里面的每一个字典，
                for dict in array
                {
                    //字典转模型
                    let status = MCStatus(dict: dict)
                    
                    statuses.append(status)
                }
                
                // 字典转模型完成，告诉调用者，有模型数据
                
                // 单张图片要设置为图片本来到大小，服务器没有提供图片等大小，需要我们自己先将图片下载下来 缓存到本地，就可以知道图片的大小了，再通知控制器，获取到了微博数据，就可以拿到图片等大小了
                // 所有的图片都下载完成的时候才通知调用者获取到微博数据
                self.cacheWebImage(statuses, finished: finished)
                
//                finished(statuses: statuses, error: nil)
            }
            else
            {
                // 返回的数据不能字典转模型，告诉调用者，没有模型数据
                finished(statuses: nil, error: nil)
            }
        }
    }
    
    //MARK: - 缓存网络图片
    private class func cacheWebImage(statuses: [MCStatus], finished: (statuses: [MCStatus]?, error: NSError?) ->())
    {
        // 创建任务组
        let group = dispatch_group_create()
        
        // 记录下载图片大小
        var length = 0
        
        // 遍历每一个模型
        for status in statuses
        {
            // 判断是否有图片，没有图片就跳过，遍历下一个
            guard let urls = status.pictureURLs else
            {
                // 能到这里面来，说明没有图片,跳过这个模型，遍历下一个模型
                continue
            }
            // 说明 status.pictureURLs 不为空
            // 只需要缓存单张图片的情况，多张图片可以等到显示的时候再去加载,可以减少缓存图片等时间
//            for url in urls
//            {
            //判断是否是单张图片
            if urls.count == 1
            {
                let url = urls[0]
                
                // 遍历地址，去下载图片
                // 使用SDWebImage去下载图片，异步下载图片
                
                //在异步任务开始之前进入组
                dispatch_group_enter(group)
                SDWebImageManager.sharedManager().downloadWithURL(url, options: SDWebImageOptions(rawValue: 0), progress: nil, completed: { (image, error, _, _) -> Void in
                    
                    // SDWebImage下载完毕
                    
                    // 离开组
                    dispatch_group_leave(group)
                    
                    if error != nil
                    {
                        print("下载图片失败-->\(url)");
                        
                        return
                    }
                    
                    print("下载图片成功-->\(url)")
                    
                    let data = UIImagePNGRepresentation(image)!
                    
                    // 记录下载图片的大小
                    length += data.length
                })
            }
        }
        // 监听group中的所有任务都完成
        dispatch_group_notify(group, dispatch_get_main_queue()) { () -> Void in
            
            print("所有图片都下载完毕length--->\(CGFloat(length) / 1024.0 / 1024.0) M")
            
            // 通知调用者
            finished(statuses: statuses, error: nil)
        }
    }
}



































